#ifndef HEROS_HH
#define HEROS_HH

#include "Ahero.hh"
#include "Aenemy.hh"
#include "IO.hh"
#include "randomFunc.hh"
#include "buffAndEffect.hh"
#include "hero_setting.hh"

namespace heros {
    class highwayman : public Ahero
    {
    public:
        highwayman(std::string enemy_name, unsigned position_inteam);
        highwayman(const highwayman& other);
        highwayman& operator=(const highwayman& other);
        ~highwayman() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Jester : public Ahero
    {
    public:
        Jester(std::string enemy_name, unsigned position_inteam);
        Jester(const Jester& other);
        Jester& operator=(const Jester& other);
        ~Jester() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Crusader : public Ahero
    {
    public:
        Crusader(std::string enemy_name, unsigned position_inteam);
        Crusader(const Crusader& other);
        Crusader& operator=(const Crusader& other);
        ~Crusader() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Houndmaster : public Ahero
    {
    public:
        Houndmaster(std::string enemy_name, unsigned position_inteam);
        Houndmaster(const Houndmaster& other);
        Houndmaster& operator=(const Houndmaster& other);
        ~Houndmaster() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Bounty_Hunter: public Ahero
    {
    public:
        Bounty_Hunter(std::string enemy_name, unsigned position_inteam);
        Bounty_Hunter(const Bounty_Hunter& other);
        Bounty_Hunter& operator=(const Bounty_Hunter& other);
        ~Bounty_Hunter() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Leper : public Ahero
    {
    public:
        Leper(std::string enemy_name, unsigned position_inteam);
        Leper(const Leper& other);
        Leper& operator=(const Leper& other);
        ~Leper() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Vestal: public Ahero
    {
    public:
        Vestal(std::string enemy_name, unsigned position_inteam);
        Vestal(const Vestal& other);
        Vestal& operator=(const Vestal& other);
        ~Vestal() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };

    class Plague_Doctor : public Ahero
    {
    public:
        Plague_Doctor(std::string enemy_name, unsigned position_inteam);
        Plague_Doctor(const Plague_Doctor& other);
        Plague_Doctor& operator=(const Plague_Doctor& other);
        ~Plague_Doctor() override;

        void skill1(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
        void skill2(std::vector<ICharacter*>& team, std::vector<ICharacter*>& other_team, unsigned target_pos) override;
    };
}

#endif